跳到主要内容

Zookeeper zkCli 命令

基础命令使用

启动服务

# 启动:
zkServer.sh start
# 停止:
zkServer.sh stop
# 查看状态:
zkServer.sh status

然后通过下面这个命令进入终端

./zkCli.sh

退出终端用 quit

命令一览

注意:早期版本的 zk 是输入命令后会自动打印状态,新版得加个 -s 参数才行

下面是命令一览

[zkshell: 0] help
ZooKeeper -server host:port cmd args
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit # 退出终端
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
rmr path
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
From here, you

查看 zk 状态

使用下面这个命令可以查看当前 zk 的状态

echo stat|nc 127.0.0.1 2181 

如下显示为 Leader

方式二:

./zkServer.sh status

可以看到 zk 的配置文件的位置

create 命令创建节点

create 命令用于创建节点并赋值

create [-s] [-e] path data acl

参数:

[-s] [-e]:-s 和 -e 都是可选的,-s 代表顺序节点, -e 代表临时节点,注意其中 -s 和 -e 可以同时使用的,并且临时节点不能再创建子节点。
path:指定要创建节点的路径,比如 `/test`
data:要在此节点存储的数据。
path:访问权限相关,默认是 world,相当于全世界都能访问。

创建子节点

create /hadoop/temp "these are the data"

创建持久节点

如下创建一个 /hadoop 节点(默认创建的节点是持久节点),保存的数据是 123456

create /hadoop "123456"

创建一个顺序节点(顺序节点可以是持久的或临时的)

如下,创建的节点名称一样都是 /a 但是 zk 会自动在后面加上 0000000001

取数据也是通过 get /a0000000001

创建临时节点

create -e /temp "123456"

他会在客户端与 ZooKeeper 集合断开连接时被删除(即 quit

set 修改节点

set 命令用于修改节点存储的数据。

set path data [version]

参数:

path:节点路径。
data:需要存储的数据。
[version]:可选项,版本号(可用作乐观锁)。

使用例:

ls 查看目录

在老版本有 ls2 这个命令,新版本这个命令变成了下面这个

ls -s path

代替了

递归查看

ls -R path

get 命令取得数据

get 命令用于获取节点数据和状态信息。

get path [watch]
  • path:代表路径。
  • [watch]:对节点进行事件监听。

delete 删除节点

语法:

delete path # 节点下面有子节点的话就无法删除
delete -v [版本号] path # 节点下面有子节点的话就无法删除

rmr path # 连同节点下的子节点一并删除
# 新版换成了 deleteall 命令
deleteall path # 删除全部

stat 查看节点状态

检查状态 stat

Zookeeper 的每个 ZNode 上都会存储数据,对应到每个 ZNode,Zookeeper 都会为其维护一个叫做 Stat 的数据结构,Stat 中记录的内容如下:

cZxid: 节点创建时的zxid
ctime: 节点创建时间
mZxid: 最后一次更新的zxid
mtime: 最后一次更新的时间
pZxid: 子节点的最后版本
cversion: 子节点数据更新次数
dataVersion: 节点数据更新次数
aclVersion: acl的变更次数
ephemeralOwner: 如果znode是临时节点,则值为所有者的sessionId;如果不是临时节点,则为零
dataLength: 节点的数据长度
numChildren: 子节点个数

监听器 watch

get path -w

使用 get path watch 注册的监听器能够在 节点内容 发生改变的时候,向客户端发出通知。需要注意的是 zookeeper 的触发器是一次性的(One-time trigger),即触发一次后就会立即失效。

# 旧版的写法
get path watch

# 新版的写法
get path -w

终端一

终端二

终端二修改后,回到终端一可以看到发送了事件

stat path watch

使用 stat path watch 注册的监听器能够在 节点状态 发生改变的时候,向客户端发出通知。

# 旧版的写法
stat path watch

# 新版的写法
stat path -w

ls path watch

使用 ls path watch 注册的监听器能够监听该节点下所有 子节点的增加和删除操作

# 旧版的写法
ls path watch

# 新版的写法
ls path -w

Acl权限控制

zookeeper 的 access control list 访问控制列表可以使用:scheme:id:permission 来标识,主要涵盖三个方面:

  • 权限模式(scheme):授权的策略
  • 授权对象(id):授权的对象
  • 权限(permission):授予的权限

其特性如下:

  • zookeeper 的权限控制是基于每个 znode 节点的,需要对每个节点设置权限。
  • 每个 znode 支持设置多种权限控制发难和多个权限。
  • 字节点不会继承父节点的权限,客户端无权访问某个节点,但可能可以访问它的子节点。

授权的模式

采用何种方式授权

方案描述
world只有一个用户:anyone,代表登录 zookeeper 所有人(默认)
ip对客户端使用IP地址认证
auth使用已添加认证的用户认证
digest使用“用户名:密码”方式认证

授予的权限

权限ACL简写描述
createc可以创建子节点
deleted可以删除子节点(仅下一级节点)
readr可以读取节点数据及显示子节点列表
writew可以设置节点数据
admina可以设置节点访问控制列表权限

ACL 关于授权的命令

命令使用方式描述
getAclgetAcl path读取ACL权限
setAclsetAcl path acl设置ACL权限
addauthaddauth scheme auth添加认证用户(密码是以加密的形式存在)
#连接zk
zkCli.sh -server 127.0.0.1:2181
create /test 123
create /test/abc aaa
# 查看默认权限
getAcl /test/abc
'world,'anyone
:cdrwa

world 授权模式

语法:

setAcl path <world>:<anyone>:<acl>

示例:

setAcl /java world:anyone:drwa

IP 授权模式

语法:

setAcl path <ip>:<ip地址>:<acl> 

示例:

setAcl /java ip:127.0.0.1:cdrwa,ip:127.0.0.2:cdrwa

digest 授权模式(密码)

Digest 是最常用的权限控制模式,也更符合我们对于权限控制的认识,其类似于 username:password 形式的权限标识来进行权限配置,便于区分不同应用来进行权限控制。

当我们通过 username:password 形式配置了权限标识。这里的密码是密文,ZooKeeper 会对其先后进行两次编码处理,分别是 SHA-1 算法加密和 BASE64 编码,在 SHELL 中可以通过以下命令计算:

echo -n<user>:<password> | openssl dgst -binary -sha1 | openssl base64

先来算一个密文密码:

echo -n user-1:password-1 | openssl dgst -binary -sha1 | openssl base64
# 1g4T1B5w+se9ntA6Ckp90uPaJ30=

设置 Digest 模式的语法:

setAcl path <digest>:<username>:<password>:<acl>

示例:

setAcl /test/digest-node-1 digest:user-1:1g4T1B5w+se9ntA6Ckp90uPaJ30=:cdrwa

1g4T1B5w+se9ntA6Ckp90uPaJ30=password-1 对应的密文。

注意的是虽然可以使用明文密码 user-1:password-1 设置 ACL(实际上 ZooKeeper 认为 password-1 是两次编码处理的密文),但是获取内容时会没有权限

示例2:

# digest 需要密文的方式设置权限
setAcl /names/test digest:revin:xxqweqweqweqweq=:cdrwa

# 登录用户
add auth digest revin:revin123
get /names/test

auth 授权模式

Auth 是一种特殊模式,不会对任何授权对象 ID 进行授权,而是对所有已经添加认证的用户进行授权。

添加用户语法:

addauth digest <username>:<password>

实例:

addauth digest admin:admin

持久化 ACL 信息时,ZooKeeper 服务器会忽略 scheme:id:perm 中提供的任何授权对象表达式。但是仍必须在 ACL 中提供表达式,可以是一个空串,或者其他任意字符串,因为 ACL 必须与 scheme:id:permission 格式匹配:

语法:

setAcl path <auth>:<username>:<acl>

示例:

setAcl /test/auth-node auth:cdrwa

使用此模式我们可以给多个授权用户使用不同的用户名和密码访问 ZNode。假设我们有3个用户:

  • user-1:password-1
  • user-2:password-2
  • user-3:password-3
addauth digest user-1:password-1
addauth digest user-2:password-2
addauth digest user-3:password-3


setAcl /names/test auth:user-1:password-1:cdrwa
setAcl /names/test auth:user-2:password-2:cdrwa
setAcl /names/test auth:user-3:password-3:cdrwa

多种模式授权

setAcl /node5 ip:0.0.0.0:cdra,auth:admin:cdrea,digest:admin:x1nq8J5GOJVPY6zgzhtTtA9izLc=:cdrwa

super 超级管理员

Super模式,顾名思义就是超级用户的意思,为管理员所使用,这也是一种特殊的 Digest 模式。在 Super 模式下,超级用户可以对任意 ZooKeeper 上的数据节点进行任何操作,不会被任何节点的 ACL 所限制。

首先需要在 ZooKeeper 服务器上开启 Super 模式,方法是在 ZooKeeper 服务器启动的时候,添加如下系统属性:

-Dzookeeper.DigestAuthenticationProvider.superDigest=super:zUZ0bpqYS7FucDXsnUgxOWTto1s=

其中,super 代表了一个超级管理员的用户名;

zUZ0bpqYS7FucDXsnUgxOWTto1s= 是由 ZooKeeper 的系统管理员自主配置密码的两次编码处理后的密文,此例中使用的是 super:root 的编码。

打开 ZooKeeper 目录下的 /bin/zkServer.sh 服务器脚本,找到如下一行:

nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"

默认只有以上两个配置项,我们需要把下面的配置项加到服务器脚本中:

nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=admin:0sxEug2Dpm/NpzMPieOlFREd9Ao=" \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

重启服务后,输入下面命令添加权限

addauth digest super:root # 添加认证用户

Reference

Zookeeper 客户端基础命令使用 The number of milliseconds of each tick, 最小时间单位,很多运行时的时间 ACL权限控制命令 ZooKeeper ACL权限控制机制